parent
							
								
									d47d487b8a
								
							
						
					
					
						commit
						96a7b58091
					
				| @ -0,0 +1,72 @@ | |||||||
|  | //
 | ||||||
|  | // Created by MightyPork on 2018/02/03.
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #include "platform.h" | ||||||
|  | #include "unit_base.h" | ||||||
|  | 
 | ||||||
|  | #define OW_INTERNAL | ||||||
|  | #include "_ow_internal.h" | ||||||
|  | #include "_ow_init.h" | ||||||
|  | 
 | ||||||
|  | /** Allocate data structure and set defaults */ | ||||||
|  | error_t OW_preInit(Unit *unit) | ||||||
|  | { | ||||||
|  |     struct priv *priv = unit->data = calloc_ck(1, sizeof(struct priv)); | ||||||
|  |     if (priv == NULL) return E_OUT_OF_MEM; | ||||||
|  | 
 | ||||||
|  |     // the timer is not started until needed
 | ||||||
|  |     priv->busyWaitTimer = xTimerCreate("1w_tim", // name
 | ||||||
|  |                                        750,      // interval (will be changed when starting it)
 | ||||||
|  |                                        true,     // periodic (we use this only for the polling variant, the one-shot will stop the timer in the CB)
 | ||||||
|  |                                        unit,     // user data
 | ||||||
|  |                                        OW_TimerCb); // callback
 | ||||||
|  | 
 | ||||||
|  |     if (priv->busyWaitTimer == NULL) return E_OUT_OF_MEM; | ||||||
|  | 
 | ||||||
|  |     // some defaults
 | ||||||
|  |     priv->pin_number = 0; | ||||||
|  |     priv->port_name = 'A'; | ||||||
|  |     priv->parasitic = false; | ||||||
|  | 
 | ||||||
|  |     return E_SUCCESS; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** Finalize unit set-up */ | ||||||
|  | error_t OW_init(Unit *unit) | ||||||
|  | { | ||||||
|  |     bool suc = true; | ||||||
|  |     struct priv *priv = unit->data; | ||||||
|  | 
 | ||||||
|  |     // --- Parse config ---
 | ||||||
|  |     priv->ll_pin = hw_pin2ll(priv->pin_number, &suc); | ||||||
|  |     priv->port = hw_port2periph(priv->port_name, &suc); | ||||||
|  |     Resource rsc = hw_pin2resource(priv->port_name, priv->pin_number, &suc); | ||||||
|  |     if (!suc) return E_BAD_CONFIG; | ||||||
|  | 
 | ||||||
|  |     // --- Claim resources ---
 | ||||||
|  |     TRY(rsc_claim(unit, rsc)); | ||||||
|  | 
 | ||||||
|  |     // --- Init hardware ---
 | ||||||
|  |     LL_GPIO_SetPinMode(priv->port, priv->ll_pin, LL_GPIO_MODE_OUTPUT); | ||||||
|  |     LL_GPIO_SetPinOutputType(priv->port, priv->ll_pin, LL_GPIO_OUTPUT_PUSHPULL); | ||||||
|  |     LL_GPIO_SetPinSpeed(priv->port, priv->ll_pin, LL_GPIO_SPEED_FREQ_HIGH); | ||||||
|  |     LL_GPIO_SetPinPull(priv->port, priv->ll_pin, LL_GPIO_PULL_UP); // pull-up for OD state
 | ||||||
|  | 
 | ||||||
|  |     return E_SUCCESS; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** Tear down the unit */ | ||||||
|  | void OW_deInit(Unit *unit) | ||||||
|  | { | ||||||
|  |     struct priv *priv = unit->data; | ||||||
|  | 
 | ||||||
|  |     // Release all resources
 | ||||||
|  |     rsc_teardown(unit); | ||||||
|  | 
 | ||||||
|  |     // Delete the software timer
 | ||||||
|  |     assert_param(pdPASS == xTimerDelete(priv->busyWaitTimer, 1000)); | ||||||
|  | 
 | ||||||
|  |     // Free memory
 | ||||||
|  |     free_ck(unit->data); | ||||||
|  | } | ||||||
| @ -0,0 +1,25 @@ | |||||||
|  | //
 | ||||||
|  | // Created by MightyPork on 2018/02/03.
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #ifndef GEX_F072_OW_INIT_H | ||||||
|  | #define GEX_F072_OW_INIT_H | ||||||
|  | 
 | ||||||
|  | #ifndef OW_INTERNAL | ||||||
|  | #error bad include! | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "unit_base.h" | ||||||
|  | 
 | ||||||
|  | /** Allocate data structure and set defaults */ | ||||||
|  | error_t OW_preInit(Unit *unit); | ||||||
|  | 
 | ||||||
|  | /** Finalize unit set-up */ | ||||||
|  | error_t OW_init(Unit *unit); | ||||||
|  | 
 | ||||||
|  | /** Tear down the unit */ | ||||||
|  | void OW_deInit(Unit *unit); | ||||||
|  | 
 | ||||||
|  | extern void OW_TimerCb(TimerHandle_t xTimer); | ||||||
|  | 
 | ||||||
|  | #endif //GEX_F072_OW_INIT_H
 | ||||||
| @ -0,0 +1,71 @@ | |||||||
|  | //
 | ||||||
|  | // Created by MightyPork on 2018/02/03.
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #include "platform.h" | ||||||
|  | #include "unit_base.h" | ||||||
|  | 
 | ||||||
|  | #define OW_INTERNAL | ||||||
|  | #include "_ow_internal.h" | ||||||
|  | #include "_ow_settings.h" | ||||||
|  | 
 | ||||||
|  | /** Load from a binary buffer stored in Flash */ | ||||||
|  | void OW_loadBinary(Unit *unit, PayloadParser *pp) | ||||||
|  | { | ||||||
|  |     struct priv *priv = unit->data; | ||||||
|  | 
 | ||||||
|  |     uint8_t version = pp_u8(pp); | ||||||
|  |     (void)version; | ||||||
|  | 
 | ||||||
|  |     priv->port_name = pp_char(pp); | ||||||
|  |     priv->pin_number = pp_u8(pp); | ||||||
|  |     if (version >= 1) { | ||||||
|  |         priv->parasitic = pp_bool(pp); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** Write to a binary buffer for storing in Flash */ | ||||||
|  | void OW_writeBinary(Unit *unit, PayloadBuilder *pb) | ||||||
|  | { | ||||||
|  |     struct priv *priv = unit->data; | ||||||
|  | 
 | ||||||
|  |     pb_u8(pb, 1); // version
 | ||||||
|  | 
 | ||||||
|  |     pb_char(pb, priv->port_name); | ||||||
|  |     pb_u8(pb, priv->pin_number); | ||||||
|  |     pb_bool(pb, priv->parasitic); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | /** Parse a key-value pair from the INI file */ | ||||||
|  | error_t OW_loadIni(Unit *unit, const char *key, const char *value) | ||||||
|  | { | ||||||
|  |     bool suc = true; | ||||||
|  |     struct priv *priv = unit->data; | ||||||
|  | 
 | ||||||
|  |     if (streq(key, "pin")) { | ||||||
|  |         suc = parse_pin(value, &priv->port_name, &priv->pin_number); | ||||||
|  |     } | ||||||
|  |     else if (streq(key, "parasitic")) { | ||||||
|  |         priv->parasitic = str_parse_yn(value, &suc); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         return E_BAD_KEY; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!suc) return E_BAD_VALUE; | ||||||
|  |     return E_SUCCESS; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** Generate INI file section for the unit */ | ||||||
|  | void OW_writeIni(Unit *unit, IniWriter *iw) | ||||||
|  | { | ||||||
|  |     struct priv *priv = unit->data; | ||||||
|  | 
 | ||||||
|  |     iw_comment(iw, "Data pin"); | ||||||
|  |     iw_entry(iw, "pin", "%c%d", priv->port_name,  priv->pin_number); | ||||||
|  | 
 | ||||||
|  |     iw_comment(iw, "Parasitic (bus-powered) mode"); | ||||||
|  |     iw_entry(iw, "parasitic", str_yn(priv->parasitic)); | ||||||
|  | } | ||||||
| @ -0,0 +1,31 @@ | |||||||
|  | //
 | ||||||
|  | // Created by MightyPork on 2018/02/03.
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #ifndef GEX_F072_OW_SETTINGS_H | ||||||
|  | #define GEX_F072_OW_SETTINGS_H | ||||||
|  | 
 | ||||||
|  | #ifndef OW_INTERNAL | ||||||
|  | #error bad include! | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "unit_base.h" | ||||||
|  | 
 | ||||||
|  | /** Allocate data structure and set defaults */ | ||||||
|  | error_t OW_preInit(Unit *unit); | ||||||
|  | 
 | ||||||
|  | /** Load from a binary buffer stored in Flash */ | ||||||
|  | void OW_loadBinary(Unit *unit, PayloadParser *pp); | ||||||
|  | 
 | ||||||
|  | /** Write to a binary buffer for storing in Flash */ | ||||||
|  | void OW_writeBinary(Unit *unit, PayloadBuilder *pb); | ||||||
|  | 
 | ||||||
|  | // ------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | /** Parse a key-value pair from the INI file */ | ||||||
|  | error_t OW_loadIni(Unit *unit, const char *key, const char *value); | ||||||
|  | 
 | ||||||
|  | /** Generate INI file section for the unit */ | ||||||
|  | void OW_writeIni(Unit *unit, IniWriter *iw); | ||||||
|  | 
 | ||||||
|  | #endif //GEX_F072_OW_SETTINGS_H
 | ||||||
					Loading…
					
					
				
		Reference in new issue