Skip to content

Commit d547b63

Browse files
Merge pull request #17 from nasa-jpl/jed-dev
Jed dev
2 parents 8f9a61c + e06bd09 commit d547b63

15 files changed

+510
-110
lines changed

src/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ add_library(jsd-lib STATIC
77
jsd_el2124.c
88
jsd_egd.c
99
jsd_el3356.c
10-
jsd_jed.c
10+
jsd_jed0101.c
11+
jsd_jed0200.c
1112
jsd_timer.c
1213
jsd_ati_fts.c
1314
jsd_el3104.c

src/jsd.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
#include "jsd/jsd_el3318.h"
1616
#include "jsd/jsd_el3356.h"
1717
#include "jsd/jsd_el3602.h"
18-
#include "jsd/jsd_jed.h"
18+
#include "jsd/jsd_jed0101.h"
19+
#include "jsd/jsd_jed0200.h"
1920
#include "jsd/jsd_print.h"
2021
#include "jsd/jsd_sdo.h"
2122

@@ -464,8 +465,12 @@ bool jsd_init_single_device(jsd_t* self, uint16_t slave_id) {
464465
return jsd_el3356_init(self, slave_id);
465466
break;
466467
}
467-
case JSD_JED_PRODUCT_CODE: {
468-
return jsd_jed_init(self, slave_id);
468+
case JSD_JED0101_PRODUCT_CODE: {
469+
return jsd_jed0101_init(self, slave_id);
470+
break;
471+
}
472+
case JSD_JED0200_PRODUCT_CODE: {
473+
return jsd_jed0200_init(self, slave_id);
469474
break;
470475
}
471476
case JSD_ATI_FTS_PRODUCT_CODE: {

src/jsd_jed.c renamed to src/jsd_jed0101.c

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "jsd/jsd_jed.h"
1+
#include "jsd/jsd_jed0101.h"
22

33
#include <assert.h>
44

@@ -9,29 +9,29 @@
99
* Public functions
1010
****************************************************/
1111

12-
const jsd_jed_state_t* jsd_jed_get_state(jsd_t* self, uint16_t slave_id) {
12+
const jsd_jed0101_state_t* jsd_jed0101_get_state(jsd_t* self, uint16_t slave_id) {
1313
assert(self);
14-
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED_PRODUCT_CODE);
14+
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED0101_PRODUCT_CODE);
1515

16-
jsd_jed_state_t* state = &self->slave_states[slave_id].jed;
16+
jsd_jed0101_state_t* state = &self->slave_states[slave_id].jed0101;
1717
return state;
1818
}
1919

20-
void jsd_jed_set_cmd_value(jsd_t* self, uint16_t slave_id, uint16_t cmd) {
20+
void jsd_jed0101_set_cmd_value(jsd_t* self, uint16_t slave_id, uint16_t cmd) {
2121
assert(self);
22-
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED_PRODUCT_CODE);
22+
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED0101_PRODUCT_CODE);
2323

24-
jsd_jed_state_t* state = &self->slave_states[slave_id].jed;
24+
jsd_jed0101_state_t* state = &self->slave_states[slave_id].jed0101;
2525
state->cmd = cmd;
2626
}
2727

28-
void jsd_jed_read(jsd_t* self, uint16_t slave_id) {
28+
void jsd_jed0101_read(jsd_t* self, uint16_t slave_id) {
2929
assert(self);
30-
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED_PRODUCT_CODE);
30+
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED0101_PRODUCT_CODE);
3131

32-
jsd_jed_state_t* state = &self->slave_states[slave_id].jed;
33-
jsd_jed_txpdo_t* txpdo =
34-
(jsd_jed_txpdo_t*)self->ecx_context.slavelist[slave_id].inputs;
32+
jsd_jed0101_state_t* state = &self->slave_states[slave_id].jed0101;
33+
jsd_jed0101_txpdo_t* txpdo =
34+
(jsd_jed0101_txpdo_t*)self->ecx_context.slavelist[slave_id].inputs;
3535

3636
state->status = txpdo->status;
3737
state->w_raw = txpdo->w;
@@ -44,13 +44,13 @@ void jsd_jed_read(jsd_t* self, uint16_t slave_id) {
4444
state->z = (double)txpdo->z / 1000.0;
4545
}
4646

47-
void jsd_jed_process(jsd_t* self, uint16_t slave_id) {
47+
void jsd_jed0101_process(jsd_t* self, uint16_t slave_id) {
4848
assert(self);
49-
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED_PRODUCT_CODE);
49+
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED0101_PRODUCT_CODE);
5050

51-
jsd_jed_state_t* state = &self->slave_states[slave_id].jed;
52-
jsd_jed_rxpdo_t* rxpdo =
53-
(jsd_jed_rxpdo_t*)self->ecx_context.slavelist[slave_id].outputs;
51+
jsd_jed0101_state_t* state = &self->slave_states[slave_id].jed0101;
52+
jsd_jed0101_rxpdo_t* rxpdo =
53+
(jsd_jed0101_rxpdo_t*)self->ecx_context.slavelist[slave_id].outputs;
5454

5555
rxpdo->cmd = state->cmd;
5656

@@ -61,26 +61,26 @@ void jsd_jed_process(jsd_t* self, uint16_t slave_id) {
6161
* Private functions
6262
****************************************************/
6363

64-
bool jsd_jed_init(jsd_t* self, uint16_t slave_id) {
64+
bool jsd_jed0101_init(jsd_t* self, uint16_t slave_id) {
6565
assert(self);
66-
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED_PRODUCT_CODE);
66+
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED0101_PRODUCT_CODE);
6767
assert(self->ecx_context.slavelist[slave_id].eep_man == JSD_JPL_VENDOR_ID);
6868

6969
ec_slavet* slaves = self->ecx_context.slavelist;
7070
ec_slavet* slave = &slaves[slave_id];
7171

7272
jsd_slave_config_t* config = &self->slave_configs[slave_id];
7373

74-
slave->PO2SOconfigx = jsd_jed_PO2SO_config;
74+
slave->PO2SOconfigx = jsd_jed0101_PO2SO_config;
7575
config->PO2SO_success = false; // only set true in PO2SO callback
7676

77-
jsd_jed_state_t* state = &self->slave_states[slave_id].jed;
78-
state->cmd = config->jed.initial_cmd;
77+
jsd_jed0101_state_t* state = &self->slave_states[slave_id].jed0101;
78+
state->cmd = config->jed0101.initial_cmd;
7979

8080
return true;
8181
}
8282

83-
int jsd_jed_PO2SO_config(ecx_contextt* ecx_context, uint16_t slave_id) {
83+
int jsd_jed0101_PO2SO_config(ecx_contextt* ecx_context, uint16_t slave_id) {
8484
jsd_slave_config_t* slave_configs =
8585
(jsd_slave_config_t*)ecx_context->userdata;
8686
jsd_slave_config_t* config = &slave_configs[slave_id];
@@ -100,7 +100,7 @@ int jsd_jed_PO2SO_config(ecx_contextt* ecx_context, uint16_t slave_id) {
100100
config->PO2SO_success = false;
101101
} else {
102102
config->PO2SO_success = true;
103-
SUCCESS("JED[%d] drive parameters successfully configured and verified",
103+
SUCCESS("JED0101[%d] drive parameters successfully configured and verified",
104104
slave_id);
105105
}
106106
return 1;

src/jsd_jed.h renamed to src/jsd_jed0101.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
#ifndef JSD_JED_H
2-
#define JSD_JED_H
1+
#ifndef JSD_JED0101_H
2+
#define JSD_JED0101_H
33

44
#ifdef __cplusplus
55
extern "C" {
66
#endif
77

8-
#include "jsd/jsd_jed_pub.h"
8+
#include "jsd/jsd_jed0101_pub.h"
99

1010
/**
1111
* @brief TxPDO struct used to read device data in SOEM IOmap
@@ -18,7 +18,7 @@ typedef struct __attribute__((__packed__)) {
1818
uint32_t x;
1919
uint32_t y;
2020
uint32_t z;
21-
} jsd_jed_txpdo_t;
21+
} jsd_jed0101_txpdo_t;
2222

2323
/**
2424
* @brief RxPDO struct used to command the device via SOEM IOmap
@@ -27,25 +27,25 @@ typedef struct __attribute__((__packed__)) {
2727
*/
2828
typedef struct __attribute__((__packed__)) {
2929
uint16_t cmd;
30-
} jsd_jed_rxpdo_t;
30+
} jsd_jed0101_rxpdo_t;
3131

32-
/** @brief Initializes jed and registers the PO2SO function
32+
/** @brief Initializes jed0101 and registers the PO2SO function
3333
*
3434
* @param self pointer JSD context
3535
* @param slave_id index of device on EtherCAT bus
3636
* @return true on success, false on failure
3737
*/
38-
bool jsd_jed_init(jsd_t* self, uint16_t slave_id);
38+
bool jsd_jed0101_init(jsd_t* self, uint16_t slave_id);
3939

4040
/**
4141
* @brief Configuration function called by SOEM upon a PreOp to SafeOp state
42-
* transition that (re)configures JED device settings
42+
* transition that (re)configures JED0101 device settings
4343
*
4444
* @param ecx_context SOEM context pointer
4545
* @param slave_id index of device on EtherCAT bus
4646
* @return 1 on success, 0 on failure
4747
*/
48-
int jsd_jed_PO2SO_config(ecx_contextt* ecx_context, uint16_t slave_id);
48+
int jsd_jed0101_PO2SO_config(ecx_contextt* ecx_context, uint16_t slave_id);
4949

5050
#ifdef __cplusplus
5151
}

src/jsd_jed0101_pub.h

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#ifndef JSD_JED0101_PUB_H
2+
#define JSD_JED0101_PUB_H
3+
4+
#ifdef __cplusplus
5+
extern "C" {
6+
#endif
7+
8+
#include "jsd/jsd_pub.h"
9+
10+
/**
11+
* @brief Read the JED0101 state
12+
*
13+
* @param self pointer to JSD context
14+
* @param slave_id slave id of JED0101
15+
* @return Pointer to JED0101 state
16+
*/
17+
const jsd_jed0101_state_t* jsd_jed0101_get_state(jsd_t* self, uint16_t slave_id);
18+
19+
/**
20+
* @brief Sets the cmd PDO register on the JED0101 board
21+
*
22+
* @param self pointer to JSD context
23+
* @param slave_id id of JED0101
24+
* @param cmd Command integer value
25+
*/
26+
void jsd_jed0101_set_cmd_value(jsd_t* self, uint16_t slave_id, uint16_t cmd);
27+
28+
/**
29+
* @brief Converts raw PDO data to state data
30+
*
31+
* @param self pointer to JSD context
32+
* @param slave_id id of JED0101
33+
*/
34+
void jsd_jed0101_read(jsd_t* self, uint16_t slave_id);
35+
36+
/**
37+
* @brief Processes Async SDO responses
38+
*
39+
* @param self pointer to JSD context
40+
* @param slave_id id of JED0101
41+
*/
42+
void jsd_jed0101_process(jsd_t* self, uint16_t slave_id);
43+
44+
#ifdef __cplusplus
45+
}
46+
#endif
47+
48+
#endif

src/jsd_jed_types.h renamed to src/jsd_jed0101_types.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
1-
#ifndef JSD_JED_TYPES_H
2-
#define JSD_JED_TYPES_H
1+
#ifndef JSD_JED0101_TYPES_H
2+
#define JSD_JED0101_TYPES_H
33

44
#ifdef __cplusplus
55
extern "C" {
66
#endif
77

88
#include "jsd/jsd_common_device_types.h"
99

10-
#define JSD_JED_PRODUCT_CODE (uint32_t)0x00009252
10+
#define JSD_JED0101_PRODUCT_CODE (uint32_t)0x00009252
1111

1212
/**
13-
* @brief configuration struct for JED device initialization
13+
* @brief configuration struct for JED0101 device initialization
1414
*/
1515
typedef struct {
1616
uint16_t initial_cmd; ///< Initial cmd value
17-
} jsd_jed_config_t;
17+
} jsd_jed0101_config_t;
1818

1919
/**
20-
* @brief state data for JED module
20+
* @brief state data for JED0101 module
2121
*/
2222

2323
typedef struct {
@@ -30,8 +30,8 @@ typedef struct {
3030
double x; ///< converted x component of IMU quaternion
3131
double y; ///< converted y component of IMU quaternion
3232
double z; ///< converted z component of IMU quaternion
33-
uint16_t cmd; ///< User specified cmd mode sent to JED
34-
} jsd_jed_state_t;
33+
uint16_t cmd; ///< User specified cmd mode sent to JED0101
34+
} jsd_jed0101_state_t;
3535

3636
#ifdef __cplusplus
3737
}

src/jsd_jed0200.c

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#include "jsd/jsd_jed0200.h"
2+
3+
#include <assert.h>
4+
5+
#include "jsd/jsd.h"
6+
#include "jsd/jsd_sdo.h"
7+
8+
/****************************************************
9+
* Public functions
10+
****************************************************/
11+
12+
const jsd_jed0200_state_t* jsd_jed0200_get_state(jsd_t* self, uint16_t slave_id) {
13+
assert(self);
14+
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED0200_PRODUCT_CODE);
15+
16+
jsd_jed0200_state_t* state = &self->slave_states[slave_id].jed0200;
17+
return state;
18+
}
19+
20+
void jsd_jed0200_set_cmd_value(jsd_t* self, uint16_t slave_id, uint16_t cmd) {
21+
assert(self);
22+
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED0200_PRODUCT_CODE);
23+
24+
jsd_jed0200_state_t* state = &self->slave_states[slave_id].jed0200;
25+
state->cmd = cmd;
26+
}
27+
28+
void jsd_jed0200_read(jsd_t* self, uint16_t slave_id) {
29+
assert(self);
30+
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED0200_PRODUCT_CODE);
31+
32+
jsd_jed0200_state_t* state = &self->slave_states[slave_id].jed0200;
33+
jsd_jed0200_txpdo_t* txpdo =
34+
(jsd_jed0200_txpdo_t*)self->ecx_context.slavelist[slave_id].inputs;
35+
36+
state->status = txpdo->status;
37+
state->ticks = txpdo->ticks;
38+
state->voltage_hv = txpdo->voltage_hv;
39+
state->voltage_lv = txpdo->voltage_lv;
40+
state->voltage_12v = txpdo->voltage_12v;
41+
state->temp_ambient = txpdo->temp_ambient;
42+
state->temp_actuator = txpdo->temp_actuator;
43+
state->humidity = txpdo->humidity;
44+
state->pressure = txpdo->pressure;
45+
state->brake_current = txpdo->brake_current;
46+
state->brake_cc_val = txpdo->brake_cc_val;
47+
}
48+
49+
void jsd_jed0200_process(jsd_t* self, uint16_t slave_id) {
50+
assert(self);
51+
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED0200_PRODUCT_CODE);
52+
53+
jsd_jed0200_state_t* state = &self->slave_states[slave_id].jed0200;
54+
jsd_jed0200_rxpdo_t* rxpdo =
55+
(jsd_jed0200_rxpdo_t*)self->ecx_context.slavelist[slave_id].outputs;
56+
57+
rxpdo->cmd = state->cmd;
58+
59+
jsd_async_sdo_process_response(self, slave_id);
60+
}
61+
62+
/****************************************************
63+
* Private functions
64+
****************************************************/
65+
66+
bool jsd_jed0200_init(jsd_t* self, uint16_t slave_id) {
67+
assert(self);
68+
assert(self->ecx_context.slavelist[slave_id].eep_id == JSD_JED0200_PRODUCT_CODE);
69+
assert(self->ecx_context.slavelist[slave_id].eep_man == JSD_JPL_VENDOR_ID);
70+
71+
ec_slavet* slaves = self->ecx_context.slavelist;
72+
ec_slavet* slave = &slaves[slave_id];
73+
74+
jsd_slave_config_t* config = &self->slave_configs[slave_id];
75+
76+
slave->PO2SOconfigx = jsd_jed0200_PO2SO_config;
77+
config->PO2SO_success = false; // only set true in PO2SO callback
78+
79+
jsd_jed0200_state_t* state = &self->slave_states[slave_id].jed0200;
80+
state->cmd = config->jed0200.initial_cmd;
81+
82+
return true;
83+
}
84+
85+
int jsd_jed0200_PO2SO_config(ecx_contextt* ecx_context, uint16_t slave_id) {
86+
jsd_slave_config_t* slave_configs =
87+
(jsd_slave_config_t*)ecx_context->userdata;
88+
jsd_slave_config_t* config = &slave_configs[slave_id];
89+
90+
// There were initial issues with the Sync Managers having the wrong address
91+
uint8_t SM0, SM1, SM2, SM3;
92+
jsd_sdo_get_param_blocking(ecx_context, slave_id, 0x1C00, 1, JSD_SDO_DATA_U8,
93+
&SM0);
94+
jsd_sdo_get_param_blocking(ecx_context, slave_id, 0x1C00, 2, JSD_SDO_DATA_U8,
95+
&SM1);
96+
jsd_sdo_get_param_blocking(ecx_context, slave_id, 0x1C00, 3, JSD_SDO_DATA_U8,
97+
&SM2);
98+
jsd_sdo_get_param_blocking(ecx_context, slave_id, 0x1C00, 4, JSD_SDO_DATA_U8,
99+
&SM3);
100+
if (SM0 != 1 || SM1 != 2 || SM2 != 3 || SM3 != 4) {
101+
ERROR("Sync Manager are configured incorrectly, check the 0x1C00 register");
102+
config->PO2SO_success = false;
103+
} else {
104+
config->PO2SO_success = true;
105+
SUCCESS("JED0200[%d] drive parameters successfully configured and verified",
106+
slave_id);
107+
}
108+
return 1;
109+
}

0 commit comments

Comments
 (0)