diff options
Diffstat (limited to 'main')
| -rw-r--r-- | main/i2c.c | 49 | 
1 files changed, 43 insertions, 6 deletions
| @@ -18,18 +18,55 @@ pb_puzzle_module_t modules[CFG_PB_MOD_MAX];  size_t modules_size = 0;  static void state_exchange() { -	pb_global_state_t new_state; -	// TODO: Add calculation(?) to get global state -	// noinit -> not possible, idle -> all idle, solved -> all solved, playing -> one playing +	 +  	for (size_t i = 0; i < modules_size; i++) { +		pb_buf_t buf = pb_send_state_req(); +		pb_buf_free(&buf);  	} -	pb_hook_mod_state_write(new_state); +} + +void update_state() { +	// TODO: Add calculation(?) to get global state +	// all states idle == idle -> set first address as playingz +	// all states solved == solved +	// any state plater == playing + +	pb_global_state_t module_state; +	bool playing = false; 	// default false -> loop through modules to see if one is playing -> set to true +	bool solved = true;		// default true	 -> loop through modules to see if any is not solved -> set to false  	for (size_t i = 0; i < modules_size; i++) { -		pb_buf_t buf = pb_send_state_req(); +		module_state = modules[i].state; +		if (module_state != PB_GS_SOLVED) +			solved == false;	 -		pb_buf_free(&buf); +		if (module_state == PB_GS_PLAYING) +			playing == true; +	} + +	// set state if no further processing is needed +	if (solved == true) { +		pb_hook_mod_state_write(PB_GS_SOLVED); +		return; +	} else if (playing == true) { +		pb_hook_mod_state_write(PB_GS_PLAYING); +		return; +	} + +	// IF no module playing, get/set next module THAT IS NOT SOLVED to playing +	// and set mc state to playing +	// pb_i2c_send(addr, buff.msg, buff.size) +	 +	for (size_t i = 0; i < modules_size; i++) { +		module_state = modules[i].state; +		if (module_state == PB_GS_IDLE) { +			pb_buf_t buff = pb_send_state_set(PB_GS_PLAYING); +			pb_i2c_send(modules[i].sender, (uint8_t*)buff.data, buff.size); +			pb_hook_mod_state_write(PB_GS_PLAYING); +			return; +		}  	}  } |