blob: 8d1f72a0bd9afdadbc30fb9677b0078447e8c37d [file] [log] [blame]
Brian Silverman2df84412013-12-10 14:00:40 -08001#include "cape/fill_packet.h"
2
3#include <string.h>
4
5#include <STM32F2XX.h>
6
7#include "cape/uart_dma.h"
Brian Silvermandf49fe32013-12-11 14:21:37 -08008#include "cape/uart_common.h"
Brian Silverman2df84412013-12-10 14:00:40 -08009#include "cape/cows.h"
Brian Silverman1b6fbd02013-12-12 18:08:47 -080010#include "cape/encoder.h"
11#include "cape/crc.h"
12#include "cape/bootloader_handoff.h"
Brian Silverman18b01642013-12-13 21:12:25 -080013#include "cape/gyro.h"
Brian Silverman95244d82013-12-14 12:15:46 -080014#include "cape/analog.h"
Brian Silvermanc58872f2013-12-15 16:27:53 -080015#include "cape/robot.h"
Brian Silverman25a06d92013-12-15 16:28:52 -080016#include "cape/digital.h"
Brian Silverman176c6762013-12-19 16:28:09 -080017#include "cape/led.h"
Brian Silverman1b6fbd02013-12-12 18:08:47 -080018
Brian Silvermaned030062013-12-20 21:03:47 -080019#include "cape/uart_byte.h"
20
Brian Silverman1b6fbd02013-12-12 18:08:47 -080021#define TIMESTAMP_TIM TIM6
22#define RCC_APB1ENR_TIMESTAMP_TIMEN RCC_APB1ENR_TIM6EN
Brian Silverman2df84412013-12-10 14:00:40 -080023
24static uint8_t buffer1[DATA_STRUCT_SEND_SIZE] __attribute__((aligned(4)));
25static uint8_t buffer2[DATA_STRUCT_SEND_SIZE] __attribute__((aligned(4)));
26
Brian Silverman1b6fbd02013-12-12 18:08:47 -080027static uint32_t flash_checksum;
Brian Silverman1b6fbd02013-12-12 18:08:47 -080028
29static inline void do_fill_packet(struct DataStruct *packet) {
30 static uint64_t timestamp = 0;
31 counter_update_u64_u16(&timestamp, TIMESTAMP_TIM->CNT);
32 packet->timestamp = timestamp;
33
34 packet->flash_checksum = flash_checksum;
35
Brian Silverman18b01642013-12-13 21:12:25 -080036 struct GyroOutput gyro_output;
37 gyro_get_output(&gyro_output);
38 packet->gyro_angle = gyro_output.angle;
39 packet->old_gyro_reading = gyro_output.last_reading_bad;
40 packet->uninitialized_gyro = !gyro_output.initialized;
41 packet->zeroing_gyro = !gyro_output.zeroed;
42 packet->bad_gyro = gyro_output.gyro_bad;
Brian Silvermanf482b4c2014-03-17 19:44:20 -070043 packet->analog_errors = analog_get_errors();
Brian Silverman18b01642013-12-13 21:12:25 -080044
Brian Silvermanc58872f2013-12-15 16:27:53 -080045 robot_fill_packet(packet);
Brian Silvermanffeef3f2013-12-22 14:06:23 -080046 //counter_update_u64_u16(&timestamp, TIMESTAMP_TIM->CNT);
47 //packet->main.encoders[0] = timestamp;
Brian Silverman1b6fbd02013-12-12 18:08:47 -080048}
49
Brian Silverman2df84412013-12-10 14:00:40 -080050// Fills the new packet with data.
51void uart_dma_callback(uint8_t *buffer) {
52 struct {
53 struct DataStruct packet;
54 uint8_t padding[DATA_STRUCT_SEND_SIZE - sizeof(struct DataStruct) - 12];
55 uint32_t checksum;
Brian Silverman57621112014-01-01 16:08:24 -080056 } __attribute__((packed)) data __attribute__((aligned(4)));
Brian Silverman2df84412013-12-10 14:00:40 -080057 STATIC_ASSERT(sizeof(data) == DATA_STRUCT_SEND_SIZE - 8,
58 The_size_of_the_data_is_wrong);
59 struct DataStruct *packet = &data.packet;
60
Brian Silverman3e0a05b2013-12-22 11:33:42 -080061 do_fill_packet(packet);
Brian Silverman1b6fbd02013-12-12 18:08:47 -080062
63 uint32_t *p;
64 memcpy(&p, &packet, sizeof(void *));
Brian Silverman53f29182013-12-21 15:16:27 -080065 data.checksum = crc_calculate(p, (sizeof(data) - 4) / 4);
Brian Silverman2df84412013-12-10 14:00:40 -080066
Brian Silvermanc58872f2013-12-15 16:27:53 -080067 ((uint32_t *)buffer)[0] = 0;
Brian Silverman2df84412013-12-10 14:00:40 -080068 cows_stuff(&data, sizeof(data), buffer + 4);
69}
70
71void fill_packet_start(void) {
Brian Silverman1b6fbd02013-12-12 18:08:47 -080072 RCC->APB1ENR |= RCC_APB1ENR_TIMESTAMP_TIMEN;
Brian Silvermanffeef3f2013-12-22 14:06:23 -080073 TIMESTAMP_TIM->CR1 = 0;
74 TIMESTAMP_TIM->PSC = 600 - 1;
Brian Silverman1b6fbd02013-12-12 18:08:47 -080075 TIMESTAMP_TIM->EGR = TIM_EGR_UG;
76 TIMESTAMP_TIM->CR1 |= TIM_CR1_CEN;
77
78 crc_init();
Brian Silverman95244d82013-12-14 12:15:46 -080079 analog_init();
Brian Silverman1b6fbd02013-12-12 18:08:47 -080080 encoder_init();
Brian Silverman25a06d92013-12-15 16:28:52 -080081 digital_init();
Brian Silverman1b6fbd02013-12-12 18:08:47 -080082
Brian Silverman8dc9fd42014-02-10 13:35:43 -080083 flash_checksum =
84 crc_calculate((void *)MAIN_FLASH_START,
85 (size_t)(MAIN_FLASH_END - MAIN_FLASH_START) / 4);
Brian Silverman2df84412013-12-10 14:00:40 -080086
Brian Silverman176c6762013-12-19 16:28:09 -080087 led_set(LED_ERR, 0);
Brian Silverman391beca2013-12-28 22:32:48 -080088 gyro_init();
Brian Silverman176c6762013-12-19 16:28:09 -080089
Brian Silvermana7477342014-02-26 21:35:55 -080090 robot_init();
91
Brian Silverman57621112014-01-01 16:08:24 -080092 uart_common_configure(750000);
Brian Silvermandf49fe32013-12-11 14:21:37 -080093 uart_dma_configure(DATA_STRUCT_SEND_SIZE, buffer1, buffer2);
Brian Silverman2df84412013-12-10 14:00:40 -080094}