spislave.cpp: processing of rx data added
This commit is contained in:
		
							parent
							
								
									8373f9107b
								
							
						
					
					
						commit
						02b2bf2d4f
					
				| @ -6,7 +6,7 @@ | ||||
| 
 | ||||
| ; ---> SELECT TARGET PLATFORM HERE! <--- | ||||
| [platformio] | ||||
| env_default = generic | ||||
| ;env_default = generic | ||||
| ;env_default = ebox | ||||
| ;env_default = eboxtube | ||||
| ;env_default = heltec | ||||
| @ -17,7 +17,7 @@ env_default = generic | ||||
| ;env_default = ttgov21new | ||||
| ;env_default = ttgobeam | ||||
| ;env_default = lopy | ||||
| ;env_default = lopy4 | ||||
| env_default = lopy4 | ||||
| ;env_default = fipy | ||||
| ;env_default = lolin32litelora | ||||
| ;env_default = lolin32lora | ||||
|  | ||||
| @ -25,9 +25,9 @@ | ||||
| #define WIFI_ANTENNA 0              // 0 = internal, 1 = external
 | ||||
| 
 | ||||
| // uncomment this only if your LoPy runs on a PYTRACK BOARD
 | ||||
| //#define HAS_GPS 1
 | ||||
| //#define GPS_I2C GPIO_NUM_25, GPIO_NUM_26 // SDA (P22), SCL (P21)
 | ||||
| //#define GPS_ADDR 0x10
 | ||||
| #define HAS_GPS 1 | ||||
| #define GPS_I2C GPIO_NUM_25, GPIO_NUM_26 // SDA (P22), SCL (P21)
 | ||||
| #define GPS_ADDR 0x10 | ||||
| 
 | ||||
| // uncomment this only if your LoPy runs on a EXPANSION BOARD
 | ||||
| //#define HAS_LED (12) // use if LoPy is on Expansion Board, this has a user LED
 | ||||
|  | ||||
| @ -329,9 +329,13 @@ void lora_send(osjob_t *job) { | ||||
|   } else { | ||||
|     if (xQueueReceive(LoraSendQueue, &SendBuffer, (TickType_t)0) == pdTRUE) { | ||||
|       // SendBuffer gets struct MessageBuffer with next payload from queue
 | ||||
|       LMIC_setTxData2(SendBuffer.MessagePort, SendBuffer.Message, | ||||
|                       SendBuffer.MessageSize, (cfg.countermode & 0x02)); | ||||
|       ESP_LOGI(TAG, "%d bytes sent to LoRa", SendBuffer.MessageSize); | ||||
|       if (LMIC_setTxData2(SendBuffer.MessagePort, SendBuffer.Message, | ||||
|                           SendBuffer.MessageSize, (cfg.countermode & 0x02))) { | ||||
|         ESP_LOGI(TAG, "%d bytes sent to LoRa", SendBuffer.MessageSize); | ||||
|       } else { | ||||
|         ESP_LOGE(TAG, "coult not send %d bytes to LoRa", | ||||
|                  SendBuffer.MessageSize); | ||||
|       } | ||||
|       // sprintf(display_line7, "PACKET QUEUED");
 | ||||
|     } | ||||
|   } | ||||
| @ -341,6 +345,8 @@ void lora_send(osjob_t *job) { | ||||
|                       lora_send); | ||||
| } | ||||
| 
 | ||||
| #endif // HAS_LORA
 | ||||
| 
 | ||||
| esp_err_t lora_stack_init() { | ||||
| #ifndef HAS_LORA | ||||
|   return ESP_OK; // continue main program
 | ||||
| @ -375,21 +381,21 @@ esp_err_t lora_stack_init() { | ||||
|   LMIC_selectSubBand(1); | ||||
| #endif | ||||
| 
 | ||||
|   LMIC_startJoining(); // start joining
 | ||||
|   return ESP_OK;       // continue main program
 | ||||
|   if (!LMIC_startJoining()) { // start joining
 | ||||
|     ESP_LOGI(TAG, "Already joined"); | ||||
|   } | ||||
|    | ||||
|   return ESP_OK; // continue main program
 | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| #endif // HAS_LORA
 | ||||
| 
 | ||||
| void lora_enqueuedata(uint8_t messageType, MessageBuffer_t *message) { | ||||
|   // enqueue message in LORA send queue
 | ||||
| #ifdef HAS_LORA | ||||
|   BaseType_t ret = | ||||
|       xQueueSendToBack(LoraSendQueue, (void *)message, (TickType_t)0); | ||||
|   if (ret == pdTRUE) { | ||||
|     ESP_LOGI(TAG, "%d bytes enqueued for LORA interface", | ||||
|              message->MessageSize); | ||||
|     ESP_LOGI(TAG, "%d bytes enqueued for LORA interface", message->MessageSize); | ||||
|   } else { | ||||
|     ESP_LOGW(TAG, "LORA sendqueue is full"); | ||||
|   } | ||||
|  | ||||
| @ -48,31 +48,37 @@ void spi_slave_task(void *param) { | ||||
|     MessageBuffer_t msg; | ||||
|     size_t transaction_size; | ||||
| 
 | ||||
|     // clear rx + tx buffers
 | ||||
|     memset(txbuf, 0, sizeof(txbuf)); | ||||
|     memset(rxbuf, 0, sizeof(rxbuf)); | ||||
| 
 | ||||
|     // wait until data to send arrivey
 | ||||
|     if (xQueueReceive(SPISendQueue, &msg, portMAX_DELAY) != pdTRUE) { | ||||
|       ESP_LOGE(TAG, "Premature return from xQueueReceive() with no data!"); | ||||
|       continue; | ||||
|     } | ||||
| 
 | ||||
|     // fill tx buffer with data to send from queue and calculate crc16 cheksum
 | ||||
|     uint8_t *messageType = txbuf + 2; | ||||
|     *messageType = msg.MessagePort; | ||||
|     uint8_t *messageSize = txbuf + 3; | ||||
|     *messageSize = msg.MessageSize; | ||||
|     memcpy(txbuf + HEADER_SIZE, &msg.Message, msg.MessageSize); | ||||
|     // calculate crc16 checksum, not used yet
 | ||||
|     // uint16_t *crc = (uint16_t *)txbuf;
 | ||||
|     //*crc = crc16_be(0, messageType, msg.MessageSize + HEADER_SIZE - 2);
 | ||||
| 
 | ||||
|     // set length for spi slave driver
 | ||||
|     transaction_size = HEADER_SIZE + msg.MessageSize; | ||||
|     transaction_size += (4 - transaction_size % 4); | ||||
| 
 | ||||
|     uint16_t *crc = (uint16_t *)txbuf; | ||||
|     *crc = crc16_be(0, messageType, msg.MessageSize + HEADER_SIZE - 2); | ||||
| 
 | ||||
|     // prepare spi transaction
 | ||||
|     spi_slave_transaction_t spi_transaction = {0}; | ||||
|     spi_transaction.length = transaction_size * 8; | ||||
|     spi_transaction.tx_buffer = txbuf; | ||||
|     spi_transaction.rx_buffer = rxbuf; | ||||
| 
 | ||||
|     // wait until spi master clocks out the data, and read results in rx buffer
 | ||||
|     ESP_LOGI(TAG, "Prepared SPI transaction for %zu bytes", transaction_size); | ||||
|     ESP_LOG_BUFFER_HEXDUMP(TAG, txbuf, transaction_size, ESP_LOG_DEBUG); | ||||
|     esp_err_t ret = | ||||
| @ -80,6 +86,11 @@ void spi_slave_task(void *param) { | ||||
|     ESP_LOG_BUFFER_HEXDUMP(TAG, rxbuf, transaction_size, ESP_LOG_DEBUG); | ||||
|     ESP_LOGI(TAG, "Transaction finished with size %zu bits", | ||||
|              spi_transaction.trans_len); | ||||
| 
 | ||||
|     // check if command was received, then call interpreter with command payload
 | ||||
|     if ((spi_transaction.trans_len) && ((rxbuf[2]) == RCMDPORT)) { | ||||
|       rcommand(rxbuf + HEADER_SIZE, spi_transaction.trans_len - HEADER_SIZE); | ||||
|     }; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| @ -111,6 +122,8 @@ esp_err_t spi_init() { | ||||
|                                               .post_setup_cb = NULL, | ||||
|                                               .post_trans_cb = NULL}; | ||||
| 
 | ||||
|   // Enable pull-ups on SPI lines so we don't detect rogue pulses when no master
 | ||||
|   // is connected
 | ||||
|   gpio_set_pull_mode(SPI_MOSI, GPIO_PULLUP_ONLY); | ||||
|   gpio_set_pull_mode(SPI_SCLK, GPIO_PULLUP_ONLY); | ||||
|   gpio_set_pull_mode(SPI_CS, GPIO_PULLUP_ONLY); | ||||
| @ -131,8 +144,7 @@ void spi_enqueuedata(uint8_t messageType, MessageBuffer_t *message) { | ||||
|   BaseType_t ret = | ||||
|       xQueueSendToBack(SPISendQueue, (void *)message, (TickType_t)0); | ||||
|   if (ret == pdTRUE) { | ||||
|     ESP_LOGI(TAG, "%d bytes enqueued for SPI interface", | ||||
|              message->MessageSize); | ||||
|     ESP_LOGI(TAG, "%d bytes enqueued for SPI interface", message->MessageSize); | ||||
|   } else { | ||||
|     ESP_LOGW(TAG, "SPI sendqueue is full"); | ||||
|   } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user