Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,6 @@ components/components/*
config.bin
config.cvs
managed_components/*
.DS_Store
.vscode/settings.json
.vscode/settings.json
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
"array": "c",
"string": "c",
"string_view": "c",
"*.tcc": "c"
"*.tcc": "c",
"__locale": "c"
},
"editor.formatOnSave": false,
"cSpell.words": [
Expand Down
35 changes: 19 additions & 16 deletions components/bm1397/bm1366.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ static void _send_BM1366(uint8_t header, uint8_t * data, uint8_t data_len, bool
}

// send serial data
SERIAL_send(buf, total_length, BM1366_DEBUG_CHIP_SERIAL);
SERIAL_send(buf, total_length, debug);

free(buf);
}
Expand All @@ -105,7 +105,7 @@ static void _send_simple(uint8_t * data, uint8_t total_length)
{
unsigned char * buf = malloc(total_length);
memcpy(buf, data, total_length);
SERIAL_send(buf, total_length, BM1366_DEBUG_CHIP_SERIAL);
SERIAL_send(buf, total_length, BM1366_SERIALTX_DEBUG);

free(buf);
}
Expand All @@ -115,15 +115,15 @@ static void _send_chain_inactive(void)

unsigned char read_address[2] = {0x00, 0x00};
// send serial data
_send_BM1366((TYPE_CMD | GROUP_ALL | CMD_INACTIVE), read_address, 2, false);
_send_BM1366((TYPE_CMD | GROUP_ALL | CMD_INACTIVE), read_address, 2, BM1366_SERIALTX_DEBUG);
}

static void _set_chip_address(uint8_t chipAddr)
{

unsigned char read_address[2] = {chipAddr, 0x00};
// send serial data
_send_BM1366((TYPE_CMD | GROUP_SINGLE | CMD_SETADDRESS), read_address, 2, false);
_send_BM1366((TYPE_CMD | GROUP_SINGLE | CMD_SETADDRESS), read_address, 2, BM1366_SERIALTX_DEBUG);
}

void BM1366_send_hash_frequency(float target_freq)
Expand Down Expand Up @@ -179,7 +179,7 @@ void BM1366_send_hash_frequency(float target_freq)
}
}

_send_BM1366((TYPE_CMD | GROUP_ALL | CMD_WRITE), freqbuf, 6, false);
_send_BM1366((TYPE_CMD | GROUP_ALL | CMD_WRITE), freqbuf, 6, BM1366_SERIALTX_DEBUG);

ESP_LOGI(TAG, "Setting Frequency to %.2fMHz (%.2f)", target_freq, newf);
}
Expand Down Expand Up @@ -467,15 +467,15 @@ static uint8_t _send_init(uint64_t frequency, uint16_t asic_count)

for (uint8_t i = 0; i < chip_counter; i++) {
unsigned char set_a8_register[6] = {i * address_interval, 0xA8, 0x00, 0x07, 0x01, 0xF0};
_send_BM1366((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_a8_register, 6, false);
_send_BM1366((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_a8_register, 6, BM1366_SERIALTX_DEBUG);
unsigned char set_18_register[6] = {i * address_interval, 0x18, 0xF0, 0x00, 0xC1, 0x00};
_send_BM1366((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_18_register, 6, false);
_send_BM1366((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_18_register, 6, BM1366_SERIALTX_DEBUG);
unsigned char set_3c_register_first[6] = {i * address_interval, 0x3C, 0x80, 0x00, 0x85, 0x40};
_send_BM1366((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_first, 6, false);
_send_BM1366((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_first, 6, BM1366_SERIALTX_DEBUG);
unsigned char set_3c_register_second[6] = {i * address_interval, 0x3C, 0x80, 0x00, 0x80, 0x20};
_send_BM1366((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_second, 6, false);
_send_BM1366((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_second, 6, BM1366_SERIALTX_DEBUG);
unsigned char set_3c_register_third[6] = {i * address_interval, 0x3C, 0x80, 0x00, 0x82, 0xAA};
_send_BM1366((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_third, 6, false);
_send_BM1366((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_third, 6, BM1366_SERIALTX_DEBUG);
}

do_frequency_ramp_up();
Expand All @@ -488,7 +488,7 @@ static uint8_t _send_init(uint64_t frequency, uint16_t asic_count)
// unsigned char set_10_hash_counting[6] = {0x00, 0x10, 0x00, 0x00, 0x14, 0x46}; //S19XP-Luxos Default
unsigned char set_10_hash_counting[6] = {0x00, 0x10, 0x00, 0x00, 0x15, 0x1C}; //S19XP-Stock Default
// unsigned char set_10_hash_counting[6] = {0x00, 0x10, 0x00, 0x0F, 0x00, 0x00}; //supposedly the "full" 32bit nonce range
_send_BM1366((TYPE_CMD | GROUP_ALL | CMD_WRITE), set_10_hash_counting, 6, false);
_send_BM1366((TYPE_CMD | GROUP_ALL | CMD_WRITE), set_10_hash_counting, 6, BM1366_SERIALTX_DEBUG);

unsigned char init795[11] = {0x55, 0xAA, 0x51, 0x09, 0x00, 0xA4, 0x90, 0x00, 0xFF, 0xFF, 0x1C};
_send_simple(init795, 11);
Expand Down Expand Up @@ -516,7 +516,7 @@ static void _send_read_address(void)

unsigned char read_address[2] = {0x00, 0x00};
// send serial data
_send_BM1366((TYPE_CMD | GROUP_ALL | CMD_READ), read_address, 2, false);
_send_BM1366((TYPE_CMD | GROUP_ALL | CMD_READ), read_address, 2, BM1366_SERIALTX_DEBUG);
}

uint8_t BM1366_init(uint64_t frequency, uint16_t asic_count)
Expand All @@ -541,7 +541,7 @@ int BM1366_set_default_baud(void)
{
// default divider of 26 (11010) for 115,749
unsigned char baudrate[9] = {0x00, MISC_CONTROL, 0x00, 0x00, 0b01111010, 0b00110001}; // baudrate - misc_control
_send_BM1366((TYPE_CMD | GROUP_ALL | CMD_WRITE), baudrate, 6, false);
_send_BM1366((TYPE_CMD | GROUP_ALL | CMD_WRITE), baudrate, 6, BM1366_SERIALTX_DEBUG);
return 115749;
}

Expand Down Expand Up @@ -585,7 +585,7 @@ void BM1366_set_job_difficulty_mask(int difficulty)

ESP_LOGI(TAG, "Setting job ASIC mask to %d", difficulty);

_send_BM1366((TYPE_CMD | GROUP_ALL | CMD_WRITE), job_difficulty_mask, 6, false);
_send_BM1366((TYPE_CMD | GROUP_ALL | CMD_WRITE), job_difficulty_mask, 6, BM1366_SERIALTX_DEBUG);
}

static uint8_t id = 0;
Expand Down Expand Up @@ -616,10 +616,12 @@ void BM1366_send_work(void * pvParameters, bm_job * next_bm_job)
GLOBAL_STATE->valid_jobs[job.job_id] = 1;

//debug sent jobs - this can get crazy if the interval is short
//ESP_LOGI(TAG, "Send Job: %02X", job.job_id);
#if BM1368_DEBUG_JOBS
ESP_LOGI(TAG, "Send Job: %02X", job.job_id);
#endif
pthread_mutex_unlock(&GLOBAL_STATE->valid_jobs_lock);

_send_BM1366((TYPE_JOB | GROUP_SINGLE | CMD_WRITE), &job, sizeof(BM1366_job), false);
_send_BM1366((TYPE_JOB | GROUP_SINGLE | CMD_WRITE), &job, sizeof(BM1366_job), BM1366_DEBUG_WORK);
}

asic_result * BM1366_receive_work(void)
Expand All @@ -638,6 +640,7 @@ asic_result * BM1366_receive_work(void)
if (received != 11 || asic_response_buffer[0] != 0xAA || asic_response_buffer[1] != 0x55) {
ESP_LOGI(TAG, "Serial RX invalid %i", received);
ESP_LOG_BUFFER_HEX(TAG, asic_response_buffer, received);
SERIAL_clear_buffer();
return NULL;
}

Expand Down
38 changes: 21 additions & 17 deletions components/bm1397/bm1368.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ static void _send_simple(uint8_t * data, uint8_t total_length)
{
unsigned char * buf = malloc(total_length);
memcpy(buf, data, total_length);
SERIAL_send(buf, total_length, false);
SERIAL_send(buf, total_length, BM1368_SERIALTX_DEBUG);

free(buf);
}
Expand All @@ -115,15 +115,15 @@ static void _send_chain_inactive(void)

unsigned char read_address[2] = {0x00, 0x00};
// send serial data
_send_BM1368((TYPE_CMD | GROUP_ALL | CMD_INACTIVE), read_address, 2, false);
_send_BM1368((TYPE_CMD | GROUP_ALL | CMD_INACTIVE), read_address, 2, BM1368_SERIALTX_DEBUG);
}

static void _set_chip_address(uint8_t chipAddr)
{

unsigned char read_address[2] = {chipAddr, 0x00};
// send serial data
_send_BM1368((TYPE_CMD | GROUP_SINGLE | CMD_SETADDRESS), read_address, 2, false);
_send_BM1368((TYPE_CMD | GROUP_SINGLE | CMD_SETADDRESS), read_address, 2, BM1368_SERIALTX_DEBUG);
}

void BM1368_send_hash_frequency(float target_freq)
Expand Down Expand Up @@ -179,7 +179,7 @@ void BM1368_send_hash_frequency(float target_freq)
}
}

_send_BM1368((TYPE_CMD | GROUP_ALL | CMD_WRITE), freqbuf, 6, false);
_send_BM1368((TYPE_CMD | GROUP_ALL | CMD_WRITE), freqbuf, 6, BM1368_SERIALTX_DEBUG);

ESP_LOGI(TAG, "Setting Frequency to %.2fMHz (%.2f)", target_freq, newf);
}
Expand Down Expand Up @@ -261,7 +261,7 @@ static void do_frequency_ramp_up() {
freq_cmd[3] = freq_list[i][1];
freq_cmd[4] = freq_list[i][2];
freq_cmd[5] = freq_list[i][3];
_send_BM1368((TYPE_CMD | GROUP_ALL | CMD_WRITE), freq_cmd, 6, false);
_send_BM1368((TYPE_CMD | GROUP_ALL | CMD_WRITE), freq_cmd, 6, BM1368_SERIALTX_DEBUG);
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
Expand Down Expand Up @@ -344,19 +344,19 @@ static uint8_t _send_init(uint64_t frequency, uint16_t asic_count)
for (uint8_t i = 0; i < chip_counter; i++) {
//Reg_A8
unsigned char set_a8_register[6] = {i * address_interval, 0xA8, 0x00, 0x07, 0x01, 0xF0};
_send_BM1368((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_a8_register, 6, false);
_send_BM1368((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_a8_register, 6, BM1368_SERIALTX_DEBUG);
//Misc Control
unsigned char set_18_register[6] = {i * address_interval, 0x18, 0xF0, 0x00, 0xC1, 0x00};
_send_BM1368((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_18_register, 6, false);
_send_BM1368((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_18_register, 6, BM1368_SERIALTX_DEBUG);
//Core Register Control
unsigned char set_3c_register_first[6] = {i * address_interval, 0x3C, 0x80, 0x00, 0x8B, 0x00};
_send_BM1368((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_first, 6, false);
_send_BM1368((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_first, 6, BM1368_SERIALTX_DEBUG);
//Core Register Control
unsigned char set_3c_register_second[6] = {i * address_interval, 0x3C, 0x80, 0x00, 0x80, 0x18};
_send_BM1368((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_second, 6, false);
_send_BM1368((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_second, 6, BM1368_SERIALTX_DEBUG);
//Core Register Control
unsigned char set_3c_register_third[6] = {i * address_interval, 0x3C, 0x80, 0x00, 0x82, 0xAA};
_send_BM1368((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_third, 6, false);
_send_BM1368((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_third, 6, BM1368_SERIALTX_DEBUG);
}

do_frequency_ramp_up();
Expand All @@ -370,7 +370,7 @@ static uint8_t _send_init(uint64_t frequency, uint16_t asic_count)
// unsigned char set_10_hash_counting[6] = {0x00, 0x10, 0x00, 0x00, 0x15, 0x1C}; //S19XP-Stock Default
unsigned char set_10_hash_counting[6] = {0x00, 0x10, 0x00, 0x00, 0x15, 0xA4}; //S21-Stock Default
// unsigned char set_10_hash_counting[6] = {0x00, 0x10, 0x00, 0x0F, 0x00, 0x00}; //supposedly the "full" 32bit nonce range
_send_BM1368((TYPE_CMD | GROUP_ALL | CMD_WRITE), set_10_hash_counting, 6, false);
_send_BM1368((TYPE_CMD | GROUP_ALL | CMD_WRITE), set_10_hash_counting, 6, BM1368_SERIALTX_DEBUG);

return chip_counter;
}
Expand All @@ -395,7 +395,7 @@ static void _send_read_address(void)

unsigned char read_address[2] = {0x00, 0x00};
// send serial data
_send_BM1368((TYPE_CMD | GROUP_ALL | CMD_READ), read_address, 2, false);
_send_BM1368((TYPE_CMD | GROUP_ALL | CMD_READ), read_address, 2, BM1368_SERIALTX_DEBUG);
}

uint8_t BM1368_init(uint64_t frequency, uint16_t asic_count)
Expand All @@ -420,7 +420,7 @@ int BM1368_set_default_baud(void)
{
// default divider of 26 (11010) for 115,749
unsigned char baudrate[9] = {0x00, MISC_CONTROL, 0x00, 0x00, 0b01111010, 0b00110001}; // baudrate - misc_control
_send_BM1368((TYPE_CMD | GROUP_ALL | CMD_WRITE), baudrate, 6, false);
_send_BM1368((TYPE_CMD | GROUP_ALL | CMD_WRITE), baudrate, 6, BM1368_SERIALTX_DEBUG);
return 115749;
}

Expand Down Expand Up @@ -463,7 +463,7 @@ void BM1368_set_job_difficulty_mask(int difficulty)

ESP_LOGI(TAG, "Setting ASIC difficulty mask to %d", difficulty);

_send_BM1368((TYPE_CMD | GROUP_ALL | CMD_WRITE), job_difficulty_mask, 6, false);
_send_BM1368((TYPE_CMD | GROUP_ALL | CMD_WRITE), job_difficulty_mask, 6, BM1368_SERIALTX_DEBUG);
}

static uint8_t id = 0;
Expand Down Expand Up @@ -492,10 +492,13 @@ void BM1368_send_work(void * pvParameters, bm_job * next_bm_job)

pthread_mutex_lock(&GLOBAL_STATE->valid_jobs_lock);
GLOBAL_STATE->valid_jobs[job.job_id] = 1;
//ESP_LOGI(TAG, "Send Job: %02X", job.job_id);

#if BM1368_DEBUG_JOBS
ESP_LOGI(TAG, "Send Job: %02X", job.job_id);
#endif
pthread_mutex_unlock(&GLOBAL_STATE->valid_jobs_lock);

_send_BM1368((TYPE_JOB | GROUP_SINGLE | CMD_WRITE), &job, sizeof(BM1368_job), false);
_send_BM1368((TYPE_JOB | GROUP_SINGLE | CMD_WRITE), &job, sizeof(BM1368_job), BM1368_DEBUG_WORK);
}

asic_result * BM1368_receive_work(void)
Expand All @@ -512,8 +515,9 @@ asic_result * BM1368_receive_work(void)
}

if (received != 11 || asic_response_buffer[0] != 0xAA || asic_response_buffer[1] != 0x55) {
ESP_LOGI(TAG, "Serial RX invalid %i", received);
ESP_LOGE(TAG, "Serial RX invalid %i", received);
ESP_LOG_BUFFER_HEX(TAG, asic_response_buffer, received);
SERIAL_clear_buffer();
return NULL;
}

Expand Down
5 changes: 4 additions & 1 deletion components/bm1397/include/bm1366.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@
#define CRC5_MASK 0x1F
#define BM1366_INITIAL_DIFFICULTY 256

#define BM1366_DEBUG_CHIP_SERIAL false
#define BM1366_SERIALTX_DEBUG false
#define BM1366_SERIALRX_DEBUG false
#define BM1366_DEBUG_WORK false //causes insane amount of debug output
#define BM1368_DEBUG_JOBS false //causes insane amount of debug output

static const uint64_t BM1366_CORE_COUNT = 112;
static const uint64_t BM1366_SMALL_CORE_COUNT = 894;
Expand Down
6 changes: 5 additions & 1 deletion components/bm1397/include/bm1368.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,13 @@
#include "mining.h"

#define CRC5_MASK 0x1F

#define BM1368_INITIAL_DIFFICULTY 256

#define BM1368_SERIALTX_DEBUG false
#define BM1368_SERIALRX_DEBUG false
#define BM1368_DEBUG_WORK false //causes insane amount of debug output
#define BM1368_DEBUG_JOBS false //causes insane amount of debug output

static const uint64_t BM1368_CORE_COUNT = 80;
static const uint64_t BM1368_SMALL_CORE_COUNT = 1276;

Expand Down
7 changes: 5 additions & 2 deletions components/bm1397/serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "soc/uart_struct.h"

#include "bm1397.h"
#include "bm1368.h"
#include "serial.h"
#include "utils.h"

Expand Down Expand Up @@ -68,11 +69,13 @@ int16_t SERIAL_rx(uint8_t *buf, uint16_t size, uint16_t timeout_ms)
{
int16_t bytes_read = uart_read_bytes(UART_NUM_1, buf, size, timeout_ms / portTICK_PERIOD_MS);

#if BM1937_SERIALRX_DEBUG
#if BM1937_SERIALRX_DEBUG || BM1366_SERIALRX_DEBUG || BM1368_SERIALRX_DEBUG
size_t buff_len = 0;
if (bytes_read > 0) {
uart_get_buffered_data_len(UART_NUM_1, &buff_len);
printf("rx: ");
prettyHex((unsigned char*) buf, bytes_read);
printf("\n");
printf(" [%d]\n", buff_len);
}
#endif

Expand Down
2 changes: 1 addition & 1 deletion components/stratum/utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ void prettyHex(unsigned char *buf, int len)
{
printf("%02X ", buf[i]);
}
printf("%02X]\n", buf[len - 1]);
printf("%02X]", buf[len - 1]);
}

uint32_t flip32(uint32_t val)
Expand Down
14 changes: 8 additions & 6 deletions main/EMC2101.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,14 @@ bool EMC2101_init(bool invertPolarity)
return true;
}

// takes a fan speed percent
void EMC2101_set_fan_speed(float percent)
// takes a fan speed (0.0 ... 1.0)
void EMC2101_set_fan_speed(float eff_duty_cyc)
{
uint8_t speed;
uint8_t pwm_f;
ESP_ERROR_CHECK(i2c_master_register_read(EMC2101_I2CADDR_DEFAULT, EMC2101_PWM_FREQ, &pwm_f, 1));

speed = (uint8_t) (63.0 * percent);
speed = (uint8_t) (eff_duty_cyc * (float) pwm_f * 2.0);
ESP_ERROR_CHECK(i2c_master_register_write_byte(EMC2101_I2CADDR_DEFAULT, EMC2101_REG_FAN_SETTING, speed));
}

Expand All @@ -49,7 +51,7 @@ uint16_t EMC2101_get_fan_speed(void)
// ESP_LOGI(TAG, "Raw Fan Speed = %02X %02X", tach_msb, tach_lsb);

reading = tach_lsb | (tach_msb << 8);
RPM = 5400000 / reading;
RPM = EMC2101_FAN_RPM_NUMERATOR / reading;

// ESP_LOGI(TAG, "Fan Speed = %d RPM", RPM);
if (RPM == 82) {
Expand Down Expand Up @@ -80,9 +82,9 @@ float EMC2101_get_external_temp(void)
return result;
}

uint8_t EMC2101_get_internal_temp(void)
int8_t EMC2101_get_internal_temp(void)
{
uint8_t temp;
ESP_ERROR_CHECK(i2c_master_register_read(EMC2101_I2CADDR_DEFAULT, EMC2101_INTERNAL_TEMP, &temp, 1));
return temp;
return (int8_t)temp;
}
2 changes: 1 addition & 1 deletion main/EMC2101.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,5 +90,5 @@ void EMC2101_set_fan_speed(float);
uint16_t EMC2101_get_fan_speed(void);
bool EMC2101_init(bool);
float EMC2101_get_external_temp(void);
uint8_t EMC2101_get_internal_temp(void);
int8_t EMC2101_get_internal_temp(void);
#endif /* EMC2101_H_ */
2 changes: 2 additions & 0 deletions main/displays/displayDriver.c
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,8 @@ lv_obj_t * initTDisplayS3(void){
disp_drv.flush_cb = example_lvgl_flush_cb;
disp_drv.draw_buf = &disp_buf;
disp_drv.user_data = panel_handle;
disp_drv.sw_rotate = 1;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The display supports hardware rotation.

try this instead:

    if (!nvs_config_get_u16(NVS_CONFIG_FLIP_SCREEN, 0)) {
        esp_lcd_panel_mirror(panel_handle, true, false);
    } else {
        esp_lcd_panel_mirror(panel_handle, false, true);
    }
    ```

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, I have to try your code a.s.a.p. I tried to do it the hardware way with no success, so I chose software rotation.

disp_drv.rotated = nvs_config_get_u16(NVS_CONFIG_FLIP_SCREEN, 0) ? LV_DISP_ROT_180 : LV_DISP_ROT_NONE;
lv_disp_t *disp = lv_disp_drv_register(&disp_drv);

//Configuration is completed.
Expand Down
Binary file modified main/displays/images/Raw Images/MiningScreen.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading