|
|
View previous topic :: View next topic |
Author |
Message |
temtronic
Joined: 01 Jul 2010 Posts: 9243 Location: Greensville,Ontario
|
|
Posted: Sun Nov 20, 2022 2:53 pm |
|
|
You do understand that CCS default for an integer is UNSIGNED and NOT signed ?
I don't know what the JSON code needs, but if it does need a signed int, you will have to recode to make it so. |
|
|
kmp84
Joined: 02 Feb 2010 Posts: 354
|
|
Posted: Sun Nov 20, 2022 8:23 pm |
|
|
I understand you, but it’s Not the problem. Even if the type is wrong the code will compile. I have checked and edit this at the beginning. |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1934 Location: Norman, OK
|
|
Posted: Sun Nov 20, 2022 8:41 pm |
|
|
If you are getting errors it is NOT compiling.
If the code does compile without errors what is it
doing (or not doing) vs what you expect? _________________ Google and Forum Search are some of your best tools!!!! |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19540
|
|
Posted: Mon Nov 21, 2022 3:20 am |
|
|
Looking at the code, it is using push and pop functions on a stack.
The PIC16, does not have a software accessible stack. Result not possible.
You could write your own software stack emulation functions, but easier
honestly to not use a stack based approach to do it on this chip. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9243 Location: Greensville,Ontario
|
|
Posted: Mon Nov 21, 2022 6:50 am |
|
|
I went back to the original TBxxxx.PDF. Seems it was written for an AVR not a PIC, under the Microchip compiler and not CCS C.
There is NO way the code,as presented WILL compile for a PIC without a LOT of rewriting/ translation. |
|
|
kmp84
Joined: 02 Feb 2010 Posts: 354
|
|
Posted: Tue Nov 22, 2022 2:47 pm |
|
|
Hi All,
I have write my simple "JSON" decoder and workaround this unnecessary example.
Best Regards, |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9243 Location: Greensville,Ontario
|
|
Posted: Tue Nov 22, 2022 3:49 pm |
|
|
you should post your program in the code library here for others to see. |
|
|
kmp84
Joined: 02 Feb 2010 Posts: 354
|
|
Posted: Tue Nov 22, 2022 6:52 pm |
|
|
Hi,
I'm not sure it's for code library because I'm using just "string" library and incremental char pointer to search parts of string, but I'll post here:
Code: |
#include <16F1459.h>
#device ANSI
#device PASS_STRINGS=IN_RAM
#fuses INTRC_IO,NOPLLEN,NOPROTECT,MCLR,PUT,NOWDT // CLKOUT -> Enable clk/4 out on PIN_A4
#use delay(int=16MHz, clock=24MHz)
#use RS232(DEBUGGER,rcv=PIN_B6,xmit=PIN_B6,stream=STREAM_SERIAL_INPUT)
#define TEST_STRING "{\"yellow\":\"off\",\"red\":\"on\",\"blue\":\"off\",\"green\":\"on\"}"
#define SRC_STRING "\"red\":"
#define RED_LED_ON() output_high(PIN_C5)
#define RED_LED_OFF() output_low(PIN_C5)
#include <string.h>
int1 func(char *buff, char *src){
int1 FL = FALSE;
char *cPtr;
int8 n;
cPtr = strstr (buff, src);
n = strlen(src);
if(cPtr != NULL){
if(memcmp(cPtr+n, "\"on\"", 4) == 0)
FL = TRUE;
}
return FL;
}
void main(void){
delay_ms(100);
delay_ms(100); //StartUp Delay.
setup_adc(ADC_OFF); //Stop ADC.
setup_adc_ports(NO_ANALOGS); //Disable Adc-channels.
setup_comparator(NC_NC_NC_NC);//Disable Comparator module.
printf("\r\nStr1: %s,\r\nStr2: %s", TEST_STRING, SRC_STRING);
if(func(TEST_STRING, SRC_STRING))
RED_LED_ON();
else
RED_LED_OFF();
while(TRUE){
// user code...
}
} |
Best Regards, |
|
|
densimitre
Joined: 21 Dec 2004 Posts: 45
|
|
Posted: Mon Nov 28, 2022 4:53 pm |
|
|
kmp84 wrote: | Hi,
I'm not sure it's for code library because I'm using just "string" library and incremental char pointer to search parts of string, but I'll post here:
Code: |
#include <16F1459.h>
#device ANSI
#device PASS_STRINGS=IN_RAM
#fuses INTRC_IO,NOPLLEN,NOPROTECT,MCLR,PUT,NOWDT // CLKOUT -> Enable clk/4 out on PIN_A4
#use delay(int=16MHz, clock=24MHz)
#use RS232(DEBUGGER,rcv=PIN_B6,xmit=PIN_B6,stream=STREAM_SERIAL_INPUT)
#define TEST_STRING "{\"yellow\":\"off\",\"red\":\"on\",\"blue\":\"off\",\"green\":\"on\"}"
#define SRC_STRING "\"red\":"
#define RED_LED_ON() output_high(PIN_C5)
#define RED_LED_OFF() output_low(PIN_C5)
#include <string.h>
int1 func(char *buff, char *src){
int1 FL = FALSE;
char *cPtr;
int8 n;
cPtr = strstr (buff, src);
n = strlen(src);
if(cPtr != NULL){
if(memcmp(cPtr+n, "\"on\"", 4) == 0)
FL = TRUE;
}
return FL;
}
void main(void){
delay_ms(100);
delay_ms(100); //StartUp Delay.
setup_adc(ADC_OFF); //Stop ADC.
setup_adc_ports(NO_ANALOGS); //Disable Adc-channels.
setup_comparator(NC_NC_NC_NC);//Disable Comparator module.
printf("\r\nStr1: %s,\r\nStr2: %s", TEST_STRING, SRC_STRING);
if(func(TEST_STRING, SRC_STRING))
RED_LED_ON();
else
RED_LED_OFF();
while(TRUE){
// user code...
}
} |
Best Regards, |
Here you have a simple mqtt/json parser code (part of it) with printf() outputs for debugging purposes:
JSON MQTT data is coming from SIM7600 board. You can use ex_sisr.c in order to implement ring_buffer with enough size.
Data from YAT 2.1 terminal (for debug)
Code: |
+CMQTTRXSTART: 0,15,52<CR><LF> (24)
+CMQTTRXTOPIC: 0,15<CR><LF> (21)
8680200310XXXXX<CR><LF> (17)
+CMQTTRXPAYLOAD: 0,52<CR><LF> (23)
{"action":"post", "resource":"relay_0","state":"on"}<CR><LF> (54)
+CMQTTRXEND: 0<CR><LF> (16)
<CR><LF> (2)
|
I hope this be useful
in rx_buffer you can store data from rda_isr for post processing, using strstr to find key string position and strtok to get the data.
With a hard and dedicated work, you can make it real...
for incomming messages, poll the rx_buffer
Code: |
uint8_t mqtt_loop() {
byte ret_val = AT_RESP_ERR_DIF_RESP; //default value (not open)
/* # Chars
+CMQTTRXSTART: 14
+CMQTTRXTOPIC: 14
< > XX // Topic name
+CMQTTRXPAYLOAD: 16
< > XX // Payload data
+CMQTTRXEND: 12
Total 56
*/
fprintf(pc,"MQTT Loop: srtlen(rx_buffer): %lu \r\n", strlen(rx_buffer));
if( (strlen(rx_buffer)>56) && isStringReceived("START:") && isStringReceived("END: ") ) { // Valid MQTT received packet
fprintf(pc,"There are JSON/MQTT data\r\n");
ret_val=TRUE;
}
return(ret_val);
}
|
You can make a customized function for testing any string in the rx_buffer with strstr()
isStringReceived() is strstr() based on, like arduino SIMCOM modules code
Code: |
uint8_t get_mqtt_message() {
fprintf(pc,"get_mqtt_message(): RX_Buffer:%s\r\n",rx_buffer);
p_aux = strstr( rx_buffer,"START:"); // get starting pos of mqtt msj
//strtok(rx_buffer,"\r\n"); // discard first LINE
strtok(p_aux,"\r\n"); // discard first LINE
//strtok(rx_buffer,"\r\n"); // discard TOPIC specs
strtok(NULL,"\r\n"); // discard TOPIC specs
//topic = strtok(NULL,"\r\n"); // store TOPIC name
strcpy(topic,strtok(NULL,"\r\n"));
fprintf(pc,"TOPIC NAME:%s\r\n",topic);
//p_aux = strtok(NULL,"\r\n"); // discard PAYLOAD specs
strtok(NULL,"\r\n"); // discard PAYLOAD specs
//rx_payload = strtok(NULL,"\r\n"); // store PAYLOAD DATA.
strcpy(rx_json_payload,strtok(NULL,"\r\n"));
fprintf(pc,"JSON PAYLOAD:%s\r\n",rx_json_payload);
buffer_flush(); //clear rx_buffer
}
uint8_t process_mqtt_message(void) {
// Topic is device ID
// Actions and Status instrucctions are included inside JSON Payload
// Each actions/status commands have responses from device
if(strcmp(topic,IMEI)==0) {
fprintf(pc,"MQTT MESSAGE PROCESSING.....\r\n");
/* JSON MQTT Message
{"action":"post",
"resource":"relay_x", //X=0,1,2,3:
"state":"on"}
*/
// Parse rx_payload data
char action[10];
char resource[10];
char state[4];
char *action_p = strstr(rx_json_payload,"\"action\"");
char *resource_p = strstr(rx_json_payload,"\"resource\"");
char *state_p = strstr(rx_json_payload,"\"state\"");
//Action
strtok(action_p,":"); // discard first LINE
strcpy(action,strtok(NULL,",")); // get action name "get" or "post"
fprintf(pc,"MQTT MESSAGE: \"Action\": %s\r\n", action);
//Resource
strtok(resource_p,":"); // discard first LINE
strcpy(resource,strtok(NULL,",")); // get action name "get" or "post"
fprintf(pc,"MQTT MESSAGE: \"Resource\": %s\r\n", resource);
//State
strtok(state_p,":"); // discard first LINE
strcpy(state,strtok(NULL,"}")); // get action name "get" or "post"
fprintf(pc,"MQTT MESSAGE: \"State\": %s\r\n", state);
//fprintf(pc,"STRCMP: ACTION vs POST: %u\r\n", strcmp(action,"\"post\""));
if( strcmp(action,"\"post\"")==0) {
if (strcmp(state,"\"on\"")==0) {
if(strcmp(resource,"\"relay_0\"")==0) {
sprintf(tx_json_payload,"{\"report\":\"state\",\"relay_0\":\"on\"}");
output_high(relay_0);
mqtt_publish(IMEI, tx_json_payload, 0, 60, 0); // send a feedback about the control action status to the remote controller (MQTT client or any other control platform)
memset(tx_json_payload, '\0', 128);
buffer_flush();
}
}
if (strcmp(state,"\"off\"")==0) {
if(strcmp(resource,"\"relay_0\"")==0) {
sprintf(tx_json_payload,"{\"report\":\"state\",\"relay_0\":\"off\"}");
output_low(relay_0);
mqtt_publish(IMEI, tx_json_payload, 0, 60, 0); // send a feedback about the control action status to the remote controller (MQTT client or any other control platform)
memset(tx_json_payload, '\0', 128);
buffer_flush();
}
} //if (strcmp(state,"\"on\"")
} //if( strcmp(action,"\"post\"")==0)
} // if (IMEI)
} //process_mqtt_message(void)
|
KR |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|